home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
System Booster
/
System Booster.iso
/
Screenblankers
/
GBlanker
/
GSource
/
Blankers
/
Life
/
blank.c
next >
Wrap
C/C++ Source or Header
|
1996-09-26
|
9KB
|
366 lines
/*
* Copyright (c) 1994 Michael D. Bayne.
* All rights reserved.
*
* Please see the documentation accompanying the distribution for distribution
* and disclaimer information.
*/
#include <exec/memory.h>
#include "/includes.h"
#ifdef _M68020
#define PREFOBJ LONG
#define UPREFOBJ ULONG
#else
#define PREFOBJ WORD
#define UPREFOBJ UWORD
#endif
#define HSIZE ( sizeof( PREFOBJ ) * 8 )
#define HCELLS ( 2 * HSIZE )
#define DELAY 0
#define GENS 2
#define DENS 4
#define MODE 6
PREFOBJ *Org[2], *Orgs[2], *Lookup;
LONG uw, x1pos, x2pos, ypos, offx, BWid, Hei;
Triplet *ColorTable = 0L;
#define RAND( base, offset ) (( ULONG )( RangeRand( base ) + offset ))
#define ORG( v, x, y ) ( Org[v][Lookup[y]+x] )
#define VALUE (( i < HSIZE )? 0L : 1L )
UBYTE mask[] = { 96, 240, 240, 96 };
#define RectFill( r, x1, y1, x2, y2 ) BltPattern( r, 0L, x1, y1, x2, y2, 0 )
#include "Life_rev.h"
STATIC const UBYTE VersTag[] = VERSTAG;
VOID Defaults( PrefObject *Prefs )
{
Prefs[DELAY].po_Level = 0;
Prefs[GENS].po_Level = 150;
Prefs[DENS].po_Level = 16;
Prefs[MODE].po_ModeID = getTopScreenMode();
Prefs[MODE].po_Depth = 4;
}
VOID SpewRandomShit( PREFOBJ *Org[], PREFOBJ *Orgs[], LONG v )
{
LONG x = RAND( HCELLS-4, 2 ), y = RAND( Hei-4, 2 ), i, j;
for( j = y; j < y+3; j++ )
for( i = x; i < x+3; i++ )
if( RAND( 100, 0 ) > 25 )
{
ORG( v, i, j ) = 1;
if( i < HSIZE )
Orgs[v][2*j] |= ( 1L << ( (HSIZE-1) - i ));
else
Orgs[v][2*j+1] |= ( 1L << ( ( HSIZE - 1 ) - i ));
}
}
VOID FillWithRandomShit( struct RastPort *r, PREFOBJ *Org[], PREFOBJ *Orgs[],
LONG v, LONG Density )
{
LONG i, i1, j;
UPREFOBJ flag;
SetAPen( r, 2L );
for( ypos = 0, j = 0; j < Hei; j++, ypos += uw )
{
for( x1pos = offx, x2pos = offx+(uw*HSIZE), i = 0, i1 = HSIZE,
flag = 1L << (HSIZE-1); i < HSIZE; i++, i1++, x1pos += uw,
x2pos += uw, flag = ( 1L << (HSIZE-1) - i ))
{
if( RangeRand( 100 ) < Density )
{
ORG( v, i, j ) = 1;
Orgs[v][2*j] |= flag;
RectFill( r, x1pos, ypos, x1pos + BWid, ypos + BWid );
}
if( RangeRand( 100 ) < Density )
{
ORG( v, i1, j ) = 1;
Orgs[v][2*j+1] |= flag;
RectFill( r, x2pos, ypos, x2pos + BWid, ypos + BWid );
}
}
}
}
#define TOP (Hei*2-2)
VOID Grow( PREFOBJ *Orgs, PREFOBJ *OrgsN )
{
LONG i, j;
UPREFOBJ mask = 1L << (HSIZE-1), one = 1;
CopyMemQuick( Orgs, OrgsN, 2 * Hei * sizeof( PREFOBJ ));
if( Orgs[0] & one )
OrgsN[1] |= mask;
Orgs[0] |= ( Orgs[0] >> 1 );
if( Orgs[1] & one )
OrgsN[0] |= mask;
Orgs[1] |= ( Orgs[1] >> 1 );
if( Orgs[0] & mask )
OrgsN[1] |= one;
Orgs[0] |= ( Orgs[0] << 1 );
if( Orgs[1] & mask )
OrgsN[0] |= one;
OrgsN[1] |= ( Orgs[1] << 1 );
OrgsN[0] |= Orgs[TOP];
OrgsN[0] |= Orgs[2];
OrgsN[1] |= Orgs[TOP+1];
OrgsN[1] |= Orgs[3];
for( i = 2, j = 3; i < TOP; i += 2, j += 2 )
{
OrgsN[i] |= ( Orgs[i] >> 1 );
OrgsN[j] |= ( Orgs[j] >> 1 );
OrgsN[i] |= ( Orgs[i] << 1 );
OrgsN[j] |= ( Orgs[j] << 1 );
if( Orgs[i] & one )
OrgsN[j] |= mask;
if( Orgs[j] & one )
OrgsN[i] |= mask;
if( Orgs[i] & mask )
OrgsN[j] |= one;
if( Orgs[j] & mask )
OrgsN[i] |= one;
OrgsN[i] |= Orgs[i-2];
OrgsN[i] |= Orgs[i+2];
OrgsN[j] |= Orgs[j-2];
OrgsN[j] |= Orgs[j+2];
}
if( Orgs[TOP] & one )
OrgsN[TOP+1] |= mask;
OrgsN[TOP] |= ( Orgs[TOP] >> 1 );
if( Orgs[TOP+1] & one )
OrgsN[TOP] |= mask;
OrgsN[TOP+1] |= ( Orgs[TOP+1] >> 1 );
if( Orgs[TOP] & mask )
OrgsN[TOP+1] |= one;
OrgsN[TOP] |= ( Orgs[TOP] << 1 );
if( Orgs[TOP+1] & mask )
OrgsN[TOP] |= one;
OrgsN[TOP+1] |= ( Orgs[TOP+1] << 1 );
OrgsN[TOP] |= Orgs[TOP-2];
OrgsN[TOP] |= Orgs[0];
OrgsN[TOP+1] |= Orgs[TOP-1];
OrgsN[TOP+1] |= Orgs[1];
}
LONG Blank( PrefObject *Prefs )
{
struct Screen *LScr;
struct Window *Wnd;
struct RastPort *r;
LONG Gens, RetVal = OK, colrand, maxcol, iter = 1, nbrs, n = 0, m = 1;
LONG tofront = 0, i, i1, gi, li, j, gj, lj;
UPREFOBJ flag;
colrand = ( 1L << Prefs[MODE].po_Depth ) - 1;
if( Prefs[MODE].po_Depth > 2 )
maxcol = colrand - (1L<<Prefs[MODE].po_Depth)/6;
else
maxcol = colrand;
Gens = Prefs[GENS].po_Level;
LScr = OpenScreenTags( 0l, SA_DisplayID, Prefs[MODE].po_ModeID,
SA_Depth, Prefs[MODE].po_Depth,
SA_Quiet, TRUE, SA_Behind, TRUE,
SA_Overscan, OSCAN_TEXT, TAG_DONE );
if( LScr )
{
r = &( LScr->RastPort );
uw = LScr->Width / HCELLS;
offx = ( LScr->Width - ( uw * HCELLS ))/ 2;
Hei = LScr->Height / uw;
BWid = uw-2;
Org[0] = AllocVec( sizeof( PREFOBJ ) * HCELLS * Hei, MEMF_CLEAR );
Org[1] = AllocVec( sizeof( PREFOBJ ) * HCELLS * Hei, MEMF_CLEAR );
Orgs[0] = AllocVec( sizeof( PREFOBJ ) * 2 * Hei, MEMF_CLEAR );
Orgs[1] = AllocVec( sizeof( PREFOBJ ) * 2 * Hei, MEMF_CLEAR );
Lookup = AllocVec( sizeof( PREFOBJ ) * Hei, MEMF_CLEAR );
if( Org[0] && Org[1] && Orgs[0] && Orgs[1] && Lookup )
{
SetRGB4(&( LScr->ViewPort ), 0, 0, 0, 0 );
if( Prefs[MODE].po_Depth > 1 )
ColorTable = RainbowPalette( LScr, 0L, 1L, 0L );
else
SetRGB4(&( LScr->ViewPort ), 1, 0xF, 0xF, 0xF );
Wnd = BlankMousePointer( LScr );
ScreenToFront( LScr );
for( i = 1; i < Hei; i++ )
Lookup[i] = Lookup[i-1] + HCELLS;
FillWithRandomShit( r, Org, Orgs, n, Prefs[DENS].po_Level );
while( RetVal == OK )
{
WaitTOF();
if(!( tofront++ % 60 ))
ScreenToFront( LScr );
if( !Prefs[DELAY].po_Level ||
!( tofront % Prefs[DELAY].po_Level ))
{
if( !iter )
SpewRandomShit( Org, Orgs, n );
Grow( Orgs[n], Orgs[m] );
CopyMemQuick( Org[n], Org[m],
HCELLS * Hei * sizeof( PREFOBJ ));
for( ypos = 0, j = 0; j < Hei; j++, ypos += uw )
{
for( x1pos = offx, x2pos = offx+(uw*HSIZE), i = 0,
i1 = HSIZE; i < HSIZE;
i++, i1++, x1pos += uw, x2pos += uw )
{
flag = ( UPREFOBJ )( 1L << ( HSIZE - 1 - i ));
if( Orgs[m][2*j] & flag )
{
gi = i + 1;
li = ( i + HCELLS - 1 )%HCELLS;
gj = ( j + 1 )%Hei;
lj = ( j + Hei - 1 )%Hei;
nbrs = 0;
if( ORG( n, gi, gj )) nbrs++;
if( ORG( n, i, gj )) nbrs++;
if( ORG( n, li, gj )) nbrs++;
if( ORG( n, gi, j )) nbrs++;
if( ORG( n, li, j )) nbrs++;
if( ORG( n, gi, lj )) nbrs++;
if( ORG( n, i, lj )) nbrs++;
if( ORG( n, li, lj )) nbrs++;
switch( nbrs )
{
case 3:
if( ORG( m, i, j ) < maxcol ) {
SetAPen( r, ( LONG )++ORG( m, i, j ));
RectFill( r, x1pos, ypos, x1pos + BWid,
ypos + BWid );
} break;
case 2:
if( ORG( m, i, j )) {
if( ORG( m, i, j ) < maxcol ) {
SetAPen( r,
( LONG )++ORG( m, i, j ));
RectFill( r, x1pos, ypos, x1pos +
BWid, ypos + BWid );
}
} else
Orgs[m][2*j] &= ~flag;
break;
default:
ORG( m, i, j ) = 0;
Orgs[m][2*j] &= ~flag;
if( ORG( n, i, j )) {
SetAPen( r, 0L );
RectFill( r, x1pos, ypos, x1pos + BWid,
ypos + BWid );
}
}
}
else
ORG( m, i, j ) = 0;
if( Orgs[m][2*j+1] & flag )
{
gi = ( i1 + 1 )%HCELLS;
li = ( i1 - 1 )%HCELLS;
gj = ( j + 1 )%Hei;
lj = ( j + Hei - 1 )%Hei;
nbrs = 0;
if( ORG( n, gi, gj )) nbrs++;
if( ORG( n, i1, gj )) nbrs++;
if( ORG( n, li, gj )) nbrs++;
if( ORG( n, gi, j )) nbrs++;
if( ORG( n, li, j )) nbrs++;
if( ORG( n, gi, lj )) nbrs++;
if( ORG( n, i1, lj )) nbrs++;
if( ORG( n, li, lj )) nbrs++;
switch( nbrs )
{
case 3:
if( ORG( m, i1, j ) < maxcol )
{
SetAPen( r, ( LONG )++ORG( m, i1, j ));
RectFill( r, x2pos, ypos, x2pos + BWid,
ypos + BWid );
} break;
case 2:
if( ORG( m, i1, j ))
{
if( ORG( m, i1, j ) < maxcol )
{
SetAPen( r,
( LONG )++ORG( m, i1, j ));
RectFill( r, x2pos, ypos, x2pos +
BWid, ypos + BWid );
}
}
else
Orgs[m][2*j+1] &= ~flag;
break;
default:
ORG( m, i1, j ) = 0;
Orgs[m][2*j+1] &= ~flag;
if( ORG( n, i1, j ))
{
SetAPen( r, 0L );
RectFill( r, x2pos, ypos, x2pos + BWid,
ypos + BWid );
}
}
}
else
ORG( m, i1, j ) = 0;
}
}
n = m;
m = 1 - m;
iter = (iter+1) % Gens;
}
RetVal = ContinueBlanking();
}
if( Prefs[MODE].po_Depth )
RainbowPalette( 0L, ColorTable, 1L, 0L );
UnblankMousePointer( Wnd );
CloseScreen( LScr );
}
else
RetVal = FAILED;
if( Org[0] )
FreeVec( Org[0] );
if( Org[1] )
FreeVec( Org[1] );
if( Orgs[0] )
FreeVec( Orgs[0] );
if( Orgs[1] )
FreeVec( Orgs[1] );
if( Lookup )
FreeVec( Lookup );
}
else
RetVal = FAILED;
return RetVal;
}